/*
 * Copyright (c) 1986 Regents of the University of California.
 * All rights reserved.  The Berkeley software License Agreement
 * specifies the terms and conditions for redistribution.
 *
 *  @(#)ioctl.h 1.4 (2.11BSD GTE) 1997/3/28
 */

/*
 * Ioctl definitions
 */
#ifndef _IOCTL_
#define _IOCTL_
#ifdef KERNEL
#include "ttychars.h"
#include "ttydev.h"
#else
#include <sys/ttychars.h>
#include <sys/ttydev.h>

int     ioctl (int d, int request, ...);

#endif

struct tchars {
    char    t_intrc;        /* interrupt */
    char    t_quitc;        /* quit */
    char    t_startc;       /* start output */
    char    t_stopc;        /* stop output */
    char    t_eofc;         /* end-of-file */
    char    t_brkc;         /* input delimiter (like nl) */
};
struct ltchars {
    char    t_suspc;        /* stop process signal */
    char    t_dsuspc;       /* delayed stop process signal */
    char    t_rprntc;       /* reprint line */
    char    t_flushc;       /* flush output (toggles) */
    char    t_werasc;       /* word erase */
    char    t_lnextc;       /* literal next character */
};

/*
 * Structure for TIOCGETP and TIOCSETP ioctls.
 */

#ifndef _SGTTYB_
#define _SGTTYB_
struct sgttyb {
    char    sg_ispeed;      /* input speed */
    char    sg_ospeed;      /* output speed */
    char    sg_erase;       /* erase character */
    char    sg_kill;        /* kill character */
    short   sg_flags;       /* mode flags */
};
#endif

/*
 * Window/terminal size structure.
 * This information is stored by the kernel
 * in order to provide a consistent interface,
 * but is not used by the kernel.
 *
 * Type must be "unsigned short" so that types.h not required.
 */
struct winsize {
    unsigned short  ws_row;     /* rows, in characters */
    unsigned short  ws_col;     /* columns, in characters */
    unsigned short  ws_xpixel;  /* horizontal size, pixels */
    unsigned short  ws_ypixel;  /* vertical size, pixels */
};

/*
 * Pun for SUN.
 */
struct ttysize {
    unsigned short  ts_lines;
    unsigned short  ts_cols;
    unsigned short  ts_xxx;
    unsigned short  ts_yyy;
};
#define TIOCGSIZE   TIOCGWINSZ
#define TIOCSSIZE   TIOCSWINSZ

#ifndef _IO
/*
 * Ioctl's have the command encoded in the lower word,
 * and the size of any in or out parameters in the upper
 * word.  The high 2 bits of the upper word are used
 * to encode the in/out status of the parameter; for now
 * we restrict parameters to at most 256 bytes (disklabels are 216 bytes).
 */
#define IOCPARM_MASK    0xff            /* parameters must be < 256 bytes */
#define IOC_VOID        0x20000000      /* no parameters */
#define IOC_OUT         0x40000000      /* copy out parameters */
#define IOC_IN          0x80000000      /* copy in parameters */
#define IOC_INOUT       (IOC_IN|IOC_OUT)

#define _IO(x,y)        (IOC_VOID |                               ((x)<<8)|y)
#define _IOR(x,y,t)     (IOC_OUT  |((sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|y)
#define _IOW(x,y,t)     (IOC_IN   |((sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|y)
/* this should be _IORW, but stdio got there first */
#define _IOWR(x,y,t)    (IOC_INOUT|((sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|y)
#define _ION(x,y,n)     (IOC_INOUT|      (((n)&IOCPARM_MASK)<<16)|((x)<<8)|y)
#endif

/*
 * tty ioctl commands
 */
#define TIOCGETD        _IOR('t', 0, int)   /* get line discipline */
#define TIOCSETD        _IOW('t', 1, int)   /* set line discipline */
#define TIOCHPCL        _IO ('t', 2)        /* hang up on last close */
#define TIOCMODG        _IOR('t', 3, int)   /* get modem control state */
#define TIOCMODS        _IOW('t', 4, int)   /* set modem control state */
#define     TIOCM_LE    0001                /* line enable */
#define     TIOCM_DTR   0002                /* data terminal ready */
#define     TIOCM_RTS   0004                /* request to send */
#define     TIOCM_ST    0010                /* secondary transmit */
#define     TIOCM_SR    0020                /* secondary receive */
#define     TIOCM_CTS   0040                /* clear to send */
#define     TIOCM_CAR   0100                /* carrier detect */
#define     TIOCM_CD    TIOCM_CAR
#define     TIOCM_RNG   0200                /* ring */
#define     TIOCM_RI    TIOCM_RNG
#define     TIOCM_DSR   0400                /* data set ready */
#define TIOCGETP        _IOR('t', 8,struct sgttyb)/* get parameters -- gtty */
#define TIOCSETP        _IOW('t', 9,struct sgttyb)/* set parameters -- stty */
#define TIOCSETN        _IOW('t', 10,struct sgttyb)/* as above, but no flushtty */
#define TIOCEXCL        _IO ('t', 13)       /* set exclusive use of tty */
#define TIOCNXCL        _IO ('t', 14)       /* reset exclusive use of tty */
#define TIOCFLUSH       _IOW('t', 16, int)  /* flush buffers */
#define TIOCSETC        _IOW('t', 17,struct tchars)/* set special characters */
#define TIOCGETC        _IOR('t', 18,struct tchars)/* get special characters */
#define     TANDEM      0x00000001          /* send stopc on out q full */
#define     CBREAK      0x00000002          /* half-cooked mode */
                            /* 0x4             (old LCASE) */
#define     ECHO        0x00000008          /* echo input */
#define     CRMOD       0x00000010          /* map \r to \r\n on output */
#define     RAW         0x00000020          /* no i/o processing */
#define     ODDP        0x00000040          /* get/send odd parity */
#define     EVENP       0x00000080          /* get/send even parity */
#define     ANYP        0x000000c0          /* get any parity/send none */
                          /* 0x100             (old NLDELAY) */
                          /* 0x200 */
#define     XTABS       0x00000400          /* expand tabs on output */
                         /* 0x0800             (part of old XTABS) */
                         /* 0x1000             (old CRDELAY) */
                         /* 0x2000 */
                         /* 0x4000             (old VTDELAY) */
                         /* 0x8000             (old BSDELAY) */
#define     CRTBS       0x00010000          /* do backspacing for crt */
#define     PRTERA      0x00020000          /* \ ... / erase */
#define     CRTERA      0x00040000          /* " \b " to wipe out char */
                     /* 0x00080000             (old TILDE) */
#define     MDMBUF      0x00100000          /* start/stop output on carrier intr */
#define     LITOUT      0x00200000          /* literal output */
#define     TOSTOP      0x00400000          /* SIGSTOP on background output */
#define     FLUSHO      0x00800000          /* flush output to terminal */
#define     NOHANG      0x01000000          /* no SIGHUP on carrier drop */
#define     RTSCTS      0x02000000          /* use RTS/CTS flow control */
#define     CRTKIL      0x04000000          /* kill line with " \b " */
#define     PASS8       0x08000000
#define     CTLECH      0x10000000          /* echo control chars as ^X */
#define     PENDIN      0x20000000          /* tp->t_rawq needs reread */
#define     DECCTQ      0x40000000          /* only ^Q starts after ^S */
#define     NOFLSH      0x80000000          /* no output flush on signal */
/* locals, from 127 down */
#define TIOCLBIS        _IOW('t', 127, int) /* bis local mode bits */
#define TIOCLBIC        _IOW('t', 126, int) /* bic local mode bits */
#define TIOCLSET        _IOW('t', 125, int) /* set entire local mode word */
#define TIOCLGET        _IOR('t', 124, int) /* get local modes */
#define     LCRTBS      ((int)(CRTBS>>16))
#define     LPRTERA     ((int)(PRTERA>>16))
#define     LCRTERA     ((int)(CRTERA>>16))
#define     LMDMBUF     ((int)(MDMBUF>>16))
#define     LLITOUT     ((int)(LITOUT>>16))
#define     LTOSTOP     ((int)(TOSTOP>>16))
#define     LFLUSHO     ((int)(FLUSHO>>16))
#define     LNOHANG     ((int)(NOHANG>>16))
#define     LRTSCTS     ((int)(RTSCTS>>16))
#define     LCRTKIL     ((int)(CRTKIL>>16))
#define     LPASS8      ((int)(PASS8>>16))
#define     LCTLECH     ((int)(CTLECH>>16))
#define     LPENDIN     ((int)(PENDIN>>16))
#define     LDECCTQ     ((int)(DECCTQ>>16))
#define     LNOFLSH     ((int)(NOFLSH>>16))
#define TIOCSBRK        _IO ('t', 123)      /* set break bit */
#define TIOCCBRK        _IO ('t', 122)      /* clear break bit */
#define TIOCSDTR        _IO ('t', 121)      /* set data terminal ready */
#define TIOCCDTR        _IO ('t', 120)      /* clear data terminal ready */
#define TIOCGPGRP       _IOR('t', 119, int) /* get pgrp of tty */
#define TIOCSPGRP       _IOW('t', 118, int) /* set pgrp of tty */
#define TIOCSLTC        _IOW('t', 117,struct ltchars)/* set local special chars */
#define TIOCGLTC        _IOR('t', 116,struct ltchars)/* get local special chars */
#define TIOCOUTQ        _IOR('t', 115, int) /* output queue size */
#define TIOCSTI         _IOW('t', 114, char)/* simulate terminal input */
#define TIOCNOTTY       _IO ('t', 113)      /* void tty association */
#define TIOCPKT         _IOW('t', 112, int) /* pty: set/clear packet mode */
#define     TIOCPKT_DATA        0x00        /* data packet */
#define     TIOCPKT_FLUSHREAD   0x01        /* flush packet */
#define     TIOCPKT_FLUSHWRITE  0x02        /* flush packet */
#define     TIOCPKT_STOP        0x04        /* stop output */
#define     TIOCPKT_START       0x08        /* start output */
#define     TIOCPKT_NOSTOP      0x10        /* no more ^S, ^Q */
#define     TIOCPKT_DOSTOP      0x20        /* now do ^S ^Q */
#define TIOCSTOP        _IO ('t', 111)      /* stop output, like ^S */
#define TIOCSTART       _IO ('t', 110)      /* start output, like ^Q */
#define TIOCMSET        _IOW('t', 109, int) /* set all modem bits */
#define TIOCMBIS        _IOW('t', 108, int) /* bis modem bits */
#define TIOCMBIC        _IOW('t', 107, int) /* bic modem bits */
#define TIOCMGET        _IOR('t', 106, int) /* get all modem bits */
#define TIOCREMOTE      _IOW('t', 105, int) /* remote input editing */
#define TIOCGWINSZ      _IOR('t', 104, struct winsize)  /* get window size */
#define TIOCSWINSZ      _IOW('t', 103, struct winsize)  /* set window size */
#define TIOCUCNTL       _IOW('t', 102, int) /* pty: set/clr usr cntl mode */
#define UIOCCMD(n)      _IO ('u', n)        /* usr cntl op "n" */

#define NTTYDISC        0                   /* new tty discipline */

#define FIOCLEX         _IO('f', 1)         /* set exclusive use on fd */
#define FIONCLEX        _IO('f', 2)         /* remove exclusive use */
/* another local */
/* should use off_t for FIONREAD but that would require types.h */
#define FIONREAD        _IOR('f', 97, long) /* get # bytes to read */
#define FIONBIO         _IOW('f', 96, int)  /* set/clear non-blocking i/o */
#define FIOASYNC        _IOW('f', 95, int)  /* set/clear async i/o */
#define FIOSETOWN       _IOW('f', 94, int)  /* set owner */
#define FIOGETOWN       _IOR('f', 93, int)  /* get owner */

/* socket i/o controls */
#define SIOCSHIWAT      _IOW('s', 0, int)   /* set high watermark */
#define SIOCGHIWAT      _IOR('s', 1, int)   /* get high watermark */
#define SIOCSLOWAT      _IOW('s', 2, int)   /* set low watermark */
#define SIOCGLOWAT      _IOR('s', 3, int)   /* get low watermark */
#define SIOCATMARK      _IOR('s', 7, int)   /* at oob mark? */
#define SIOCSPGRP       _IOW('s', 8, int)   /* set process group */
#define SIOCGPGRP       _IOR('s', 9, int)   /* get process group */

#define SIOCADDRT       _IOW('r', 10, struct rtentry)   /* add route */
#define SIOCDELRT       _IOW('r', 11, struct rtentry)   /* delete route */

#define SIOCSIFADDR     _IOW ('i',12, struct ifreq)     /* set ifnet address */
#define SIOCGIFADDR     _IOWR('i',13, struct ifreq)     /* get ifnet address */
#define SIOCSIFDSTADDR  _IOW ('i',14, struct ifreq)     /* set p-p address */
#define SIOCGIFDSTADDR  _IOWR('i',15, struct ifreq)     /* get p-p address */
#define SIOCSIFFLAGS    _IOW ('i',16, struct ifreq)     /* set ifnet flags */
#define SIOCGIFFLAGS    _IOWR('i',17, struct ifreq)     /* get ifnet flags */
#define SIOCGIFBRDADDR  _IOWR('i',18, struct ifreq)     /* get broadcast addr */
#define SIOCSIFBRDADDR  _IOW ('i',19, struct ifreq)     /* set broadcast addr */
#define SIOCGIFCONF     _IOWR('i',20, struct ifconf)    /* get ifnet list */
#define SIOCGIFNETMASK  _IOWR('i',21, struct ifreq)     /* get net addr mask */
#define SIOCSIFNETMASK  _IOW ('i',22, struct ifreq)     /* set net addr mask */
#define SIOCGIFMETRIC   _IOWR('i',23, struct ifreq)     /* get IF metric */
#define SIOCSIFMETRIC   _IOW ('i',24, struct ifreq)     /* set IF metric */

#define SIOCSARP        _IOW ('i',30, struct arpreq)    /* set arp entry */
#define SIOCGARP        _IOWR('i',31, struct arpreq)    /* get arp entry */
#define SIOCDARP        _IOW ('i',32, struct arpreq)    /* delete arp entry */

#endif
